home *** CD-ROM | disk | FTP | other *** search
- ;*****************************
- ; セグメント宣言
- ;*****************************
- pmdata segment dword public 'DATA' use32
- pmdata ends
- pmcode segment dword public 'CODE' use32
- pmcode ends
-
- VRAMSEL equ 104h
- TBIOSEL equ 110h
- FONTSEL equ 138h
-
- ISKAN1 equ 1
- ISKAN2 equ 2
-
- ;*************************************
- ; protect data segment defs
- ;*************************************
- pmdata segment
-
- ;*************************************
- ; 16色VRAMビットパタ-ン
- ;*************************************
- ankfnt dd 16*256 dup(?)
- fntcol dd 256 dup(?)
-
- colptn dd 000000000h,011111111h,022222222h,033333333h
- dd 044444444h,055555555h,066666666h,077777777h
- dd 088888888h,099999999h,0AAAAAAAAh,0BBBBBBBBh
- dd 0CCCCCCCCh,0DDDDDDDDh,0EEEEEEEEh,0FFFFFFFFh
-
- fntptn dd 000000000h,0F0000000h,00F000000h,0FF000000h
- dd 000F00000h,0F0F00000h,00FF00000h,0FFF00000h
- dd 0000F0000h,0F00F0000h,00F0F0000h,0FF0F0000h
- dd 000FF0000h,0F0FF0000h,00FFF0000h,0FFFF0000h
- dd 00000F000h,0F000F000h,00F00F000h,0FF00F000h
- dd 000F0F000h,0F0F0F000h,00FF0F000h,0FFF0F000h
- dd 0000FF000h,0F00FF000h,00F0FF000h,0FF0FF000h
- dd 000FFF000h,0F0FFF000h,00FFFF000h,0FFFFF000h
- dd 000000F00h,0F0000F00h,00F000F00h,0FF000F00h
- dd 000F00F00h,0F0F00F00h,00FF00F00h,0FFF00F00h
- dd 0000F0F00h,0F00F0F00h,00F0F0F00h,0FF0F0F00h
- dd 000FF0F00h,0F0FF0F00h,00FFF0F00h,0FFFF0F00h
- dd 00000FF00h,0F000FF00h,00F00FF00h,0FF00FF00h
- dd 000F0FF00h,0F0F0FF00h,00FF0FF00h,0FFF0FF00h
- dd 0000FFF00h,0F00FFF00h,00F0FFF00h,0FF0FFF00h
- dd 000FFFF00h,0F0FFFF00h,00FFFFF00h,0FFFFFF00h
- dd 0000000F0h,0F00000F0h,00F0000F0h,0FF0000F0h
- dd 000F000F0h,0F0F000F0h,00FF000F0h,0FFF000F0h
- dd 0000F00F0h,0F00F00F0h,00F0F00F0h,0FF0F00F0h
- dd 000FF00F0h,0F0FF00F0h,00FFF00F0h,0FFFF00F0h
- dd 00000F0F0h,0F000F0F0h,00F00F0F0h,0FF00F0F0h
- dd 000F0F0F0h,0F0F0F0F0h,00FF0F0F0h,0FFF0F0F0h
- dd 0000FF0F0h,0F00FF0F0h,00F0FF0F0h,0FF0FF0F0h
- dd 000FFF0F0h,0F0FFF0F0h,00FFFF0F0h,0FFFFF0F0h
- dd 000000FF0h,0F0000FF0h,00F000FF0h,0FF000FF0h
- dd 000F00FF0h,0F0F00FF0h,00FF00FF0h,0FFF00FF0h
- dd 0000F0FF0h,0F00F0FF0h,00F0F0FF0h,0FF0F0FF0h
- dd 000FF0FF0h,0F0FF0FF0h,00FFF0FF0h,0FFFF0FF0h
- dd 00000FFF0h,0F000FFF0h,00F00FFF0h,0FF00FFF0h
- dd 000F0FFF0h,0F0F0FFF0h,00FF0FFF0h,0FFF0FFF0h
- dd 0000FFFF0h,0F00FFFF0h,00F0FFFF0h,0FF0FFFF0h
- dd 000FFFFF0h,0F0FFFFF0h,00FFFFFF0h,0FFFFFFF0h
- dd 00000000Fh,0F000000Fh,00F00000Fh,0FF00000Fh
- dd 000F0000Fh,0F0F0000Fh,00FF0000Fh,0FFF0000Fh
- dd 0000F000Fh,0F00F000Fh,00F0F000Fh,0FF0F000Fh
- dd 000FF000Fh,0F0FF000Fh,00FFF000Fh,0FFFF000Fh
- dd 00000F00Fh,0F000F00Fh,00F00F00Fh,0FF00F00Fh
- dd 000F0F00Fh,0F0F0F00Fh,00FF0F00Fh,0FFF0F00Fh
- dd 0000FF00Fh,0F00FF00Fh,00F0FF00Fh,0FF0FF00Fh
- dd 000FFF00Fh,0F0FFF00Fh,00FFFF00Fh,0FFFFF00Fh
- dd 000000F0Fh,0F0000F0Fh,00F000F0Fh,0FF000F0Fh
- dd 000F00F0Fh,0F0F00F0Fh,00FF00F0Fh,0FFF00F0Fh
- dd 0000F0F0Fh,0F00F0F0Fh,00F0F0F0Fh,0FF0F0F0Fh
- dd 000FF0F0Fh,0F0FF0F0Fh,00FFF0F0Fh,0FFFF0F0Fh
- dd 00000FF0Fh,0F000FF0Fh,00F00FF0Fh,0FF00FF0Fh
- dd 000F0FF0Fh,0F0F0FF0Fh,00FF0FF0Fh,0FFF0FF0Fh
- dd 0000FFF0Fh,0F00FFF0Fh,00F0FFF0Fh,0FF0FFF0Fh
- dd 000FFFF0Fh,0F0FFFF0Fh,00FFFFF0Fh,0FFFFFF0Fh
- dd 0000000FFh,0F00000FFh,00F0000FFh,0FF0000FFh
- dd 000F000FFh,0F0F000FFh,00FF000FFh,0FFF000FFh
- dd 0000F00FFh,0F00F00FFh,00F0F00FFh,0FF0F00FFh
- dd 000FF00FFh,0F0FF00FFh,00FFF00FFh,0FFFF00FFh
- dd 00000F0FFh,0F000F0FFh,00F00F0FFh,0FF00F0FFh
- dd 000F0F0FFh,0F0F0F0FFh,00FF0F0FFh,0FFF0F0FFh
- dd 0000FF0FFh,0F00FF0FFh,00F0FF0FFh,0FF0FF0FFh
- dd 000FFF0FFh,0F0FFF0FFh,00FFFF0FFh,0FFFFF0FFh
- dd 000000FFFh,0F0000FFFh,00F000FFFh,0FF000FFFh
- dd 000F00FFFh,0F0F00FFFh,00FF00FFFh,0FFF00FFFh
- dd 0000F0FFFh,0F00F0FFFh,00F0F0FFFh,0FF0F0FFFh
- dd 000FF0FFFh,0F0FF0FFFh,00FFF0FFFh,0FFFF0FFFh
- dd 00000FFFFh,0F000FFFFh,00F00FFFFh,0FF00FFFFh
- dd 000F0FFFFh,0F0F0FFFFh,00FF0FFFFh,0FFF0FFFFh
- dd 0000FFFFFh,0F00FFFFFh,00F0FFFFFh,0FF0FFFFFh
- dd 000FFFFFFh,0F0FFFFFFh,00FFFFFFFh,0FFFFFFFFh
-
- ;**********************************************
- ; 漢字コ-ドチェックテ-ブル
- ;**********************************************
- public kantbl
- ; 0 1 2 3 4 5 6 7 8 9 A B C D E F
- kantbl db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;0
- db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;1
- db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;2
- db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;3
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;4
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;5
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;6
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0 ;7
- db 2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;8
- db 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;9
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;A
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;B
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;C
- db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ;D
- db 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;E
- db 3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0 ;F
-
- pmdata ends
- ;*************************************
- ; protect data segment defs end
- ;*************************************
-
- ;*************************************
- ; stack parametor defs
- ;*************************************
- p_para struc
- p_vadr dd ?
- p_ebp dd ?
- p_eip dd ?
- p_str dd ?
- p_page dd ?
- p_x dd ?
- p_y dd ?
- p_chrc dd ?
- p_bakc dd ?
- p_fsiz dd ?
- p_para ends
-
- ;*************************************
- ; protect code segment defs
- ;*************************************
- pmcode segment
- assume cs:pmcode,ds:pmdata
-
- ;****************************************************************************
- ;void wrtstr(char *str,int page,int x,int y,
- ; int chrcol,int bakcol,int fsiz)
- ;****************************************************************************
- align 4 ; align set
- public wrtstr
- wrtstr proc near
- push ebp
- push eax ; vram address work
- mov ebp,esp
- push gs
- push fs
- push es
- push esi
- push edi
- push ebx
-
- mov ax,VRAMSEL ; VRAM Selecter
- mov gs,ax ; gs = VRAM Selecter
- mov ax,TBIOSEL ; TBIOS Selecter
- mov fs,ax ; fs = TBIOS
-
- mov edi,[ebp].p_y ; dsp pos Y
- shl edi,9 ; Y * 512
- mov eax,[ebp].p_x ; dsp pos X
- shr eax,1 ; X / 2
- add edi,eax ; vram address
- and edi,03FFFFh ; mask 1 page
- mov [ebp].p_vadr,edi ; work set
-
- movzx eax,byte ptr [ebp].p_chrc
- and al,0fh
- mov eax,[eax*4+offset colptn]
- mov [ebp].p_chrc,eax ; color pattn cheng
-
- movzx eax,byte ptr [ebp].p_bakc
- and al,0fh
- mov eax,[eax*4+offset colptn]
- mov [ebp].p_bakc,eax ; color pattn cheng
-
- align 4 ; align set
- wrtlop: ; Put Loop
- mov esi,[ebp].p_str ; char *str
- movzx eax,byte ptr [esi]
- inc si
- or al,al
- jz end_wrt ; End of String ?
-
- mov bl,[eax+offset kantbl]
- and bl,ISKAN1
- jz wrtank ; Not iskanji1 ?
- movzx ebx,byte ptr [esi]
- mov bh,[ebx+offset kantbl]
- and bh,ISKAN2
- jz wrtank ; Not iskanji2 ?
- mov bh,al
- inc si
- mov [ebp].p_str,esi ; Save *str
-
- shl bh,1 ; Shift Jis to Jis
- cmp bl,080h
- adc bx,1f61h
- add bl,7fh
- jc short wrtst1
- add bl,0a2h
- wrtst1: and bh,7fh ; StoJ end
-
- mov ax,0100h ; get font egb call
- mov dx,1010h ; 16 * 16
- push ds
- call pword ptr fs:[00a0h] ; Get Kanji Font
- push ds ; ds:esi = Kanji Font
- pop es ; cheng ds<->es
- pop ds
-
- mov edi,[ebp].p_vadr ; vram address
- and edi,03FFFFh ; mask 1 page
- or edi,[ebp].p_page ; page
- mov ecx,[ebp].p_fsiz ; Y = 16 Dot Font
- align 4 ; align set
-
- wtkn1: mov bx,es:[esi]
- add esi,2
-
- cmp byte ptr [ebp].p_fsiz,16
- je short wtkn2
- or bx,es:[esi]
- add esi,2
- wtkn2:
- movzx eax,bl ; Get Kanji Left Font Pattan
- mov eax,[eax*4+fntptn] ; Get Vram Bit Patan
- mov edx,eax
- not edx
- and eax,[ebp].p_chrc
- and edx,[ebp].p_bakc
- or eax,edx
- mov gs:[edi],eax ; Write Kanji Left Font
-
- movzx eax,bh ; Get Kanji Right Font Pattan
- mov eax,[eax*4+fntptn] ; Get Vram Bit Patan
- mov edx,eax
- not edx
- and eax,[ebp].p_chrc
- and edx,[ebp].p_bakc
- or eax,edx
- mov gs:[edi+4],eax ; Write Kanji Right Font
-
- add edi,512 ; 1 Line 512 Byte
- and edi,03FFFFh
- or edi,[ebp].p_page ; Page
- loop wtkn1
-
- add [ebp].p_vadr,8 ; 16 / 2
- jmp wrtlop ; Next Put String Loop
-
- align 4 ; align set
- wrtank: ; Write Ank Font
- cmp al,1Bh ; Esc Code
- jne short wtak0
-
- movzx eax,byte ptr [esi]
- inc esi
- wtak0: mov [ebp].p_str,esi ; Save *str
- mov esi,eax
-
- cmp byte ptr [ebp].p_fsiz,16
- jne short wrtft1
- shl esi,4 ; x16
- add esi,3D800h ; 8x16 ANK Font Offset
- jmp short wrtft2
- wrtft1: shl esi,3 ; x8
- add esi,3D000h ; 8x8 ANK Font Offset
-
- wrtft2: mov ax,FONTSEL ; ANK Font Selecter
- mov es,ax
-
- mov edi,[ebp].p_vadr ; vram address
- and edi,03FFFFh ; mask 1 page
- or edi,[ebp].p_page ; Page
- mov ecx,[ebp].p_fsiz ; Y = 16 Dot Font
- align 4 ; align set
-
- wtak1: movzx eax,byte ptr es:[esi] ; Get Font Pattan
- inc esi
- mov eax,[eax*4+fntptn] ; Get Vram Bit Patan
- mov edx,eax
- not edx
- and eax,[ebp].p_chrc
- and edx,[ebp].p_bakc
- or eax,edx
- mov gs:[edi],eax ; Write Ank Font
-
- add edi,512 ; 1 Line 512 Byte
- and edi,03FFFFh
- or edi,[ebp].p_page ; Page
- loop wtak1
-
- add [ebp].p_vadr,4 ; 8 / 2
- jmp wrtlop ; Next Put String Loop
-
- end_wrt:
- pop ebx
- pop edi
- pop esi
- pop es
- pop fs
- pop gs
- pop eax ; work dmy pop
- pop ebp
- ret ; end of wrtstr
-
- wrtstr endp
-
- ;*****************************************************
- ;void putstr(char *str,int page,int y)
- ;*****************************************************
- align 4 ; align set
- public putstr
- putstr proc near
- push ebp
- push eax ; vram address work
- mov ebp,esp
- xor eax,eax
- push eax
-
- push gs
- push fs
- push es
- push esi
- push edi
- push edx
- push ecx
- push ebx
-
- cld
- mov ax,VRAMSEL ; VRAM Selecter
- mov es,ax ; es = VRAM Selecter
- mov ax,TBIOSEL ; TBIOS Selecter
- mov fs,ax ; fs = TBIOS
- mov ax,ds
- mov gs,ax ; gs = ds
-
- mov edi,[ebp].p_x ; dsp pos Y !!!! x == y
- shl edi,9 ; Y * 512
- and edi,03FFFFh ; mask 1 page
- mov [ebp].p_vadr,edi ; work set
-
- align 4 ; align set
- putlop: ; Put Loop
- mov esi,[ebp].p_str ; char *str
- putlp2:
- lodsb ; Get String ※
- or al,al
- je end_put ; End of String ?
-
- movzx eax,al
- mov bl,[eax+offset kantbl]
- and bl,ISKAN1
- jz putank ; Not iskanji1 ?
- movzx ebx,byte ptr [esi]
- mov bh,[ebx+offset kantbl]
- and bh,ISKAN2
- jz putank ; Not iskanji2 ?
- mov bh,al
- inc esi ; doubel_word ????? ※
- mov [ebp].p_str,esi ; Save *str
-
- shl bh,1 ; Shift Jis to Jis
- cmp bl,080h
- adc bx,1f61h
- add bl,7fh
- jc short knf1
- add bl,0a2h
- knf1: and bh,7fh ; StoJ end
-
- mov ax,0100h
- mov dx,1010h
-
- call pword ptr fs:[00a0h] ; Get Kanji Font
-
- mov edi,[ebp].p_vadr ; *vram
- add edi,[ebp-4]
- and edi,03FFFFh ; mask 1 page
- or edi,[ebp].p_page ; or Page Offset
- mov ebx,offset fntcol
- xor edx,edx ; edx=0
- xor ecx,ecx ; ecx=0
-
- REPT 16
- lodsw ; Get Kanji Font Pattern
- mov cl,al ; Left Font Pattern
- mov dl,ah ; Right Font Pattern
- mov eax,gs:[ebx+ecx*4] ; Get Vram Bit Patan
- stosd ; Write Left Font
- mov eax,gs:[ebx+edx*4] ; Get Vram Bit Patan
- stosd ; Write Right Font
- add edi,512-4*2 ; 1 Line 512 Byte
- ENDM
-
- mov ax,gs
- mov ds,ax
- add dword ptr [ebp-4],8 ; 16 / 2 Next vram Address
-
- jmp putlop ; Next Put String Loop
-
- align 4 ; align set
- putank: ; Write Ank Font
- cmp al,1Bh ; ESC code
- jne putak1
- lodsb ; Get String
-
- putak1: mov [ebp].p_str,esi ; Save *str
- movzx esi,al
- shl esi,6 ; 4 x 16 = 64
- add esi,offset ankfnt ; ANK Font Table Offset
-
- mov edi,[ebp].p_vadr ; *vram
- add edi,[ebp-4]
- and edi,03FFFFh ; mask 1 page
- or edi,[ebp].p_page ; page add
- mov ebx,512-4
-
- REPT 16
- movsd ; Trans Font
- add edi,ebx ; Line add
- ENDM
-
- add dword ptr [ebp-4],4 ; 8 / 2 Next vram Address
-
- jmp putlop ; Next Put String Loop
-
- align 4
- end_put:
- mov ebx,320
- sub ebx,[ebp-4] ; nokori dword
- je nonclr
- shr ebx,2 ; / 4
-
- mov edi,[ebp].p_vadr ; *vram
- add edi,[ebp-4] ; work add
- and edi,03FFFFh
- or edi,[ebp].p_page ; or Page Offset
- mov edx,[ebp-4]
- add edx,512-320
- mov eax,[fntcol]
- REPT 16
- mov ecx,ebx ; nokori dword
- rep stosd
- add edi,edx
- and edi,03FFFFh
- or edi,[ebp].p_page
- endm
- nonclr:
- pop ebx
- pop ecx
- pop edx
- pop edi
- pop esi
- pop es
- pop fs
- pop gs
- add esp,8 ; work pop
- pop ebp
- ret ; end of putstr
- putstr endp
-
- ;***************************************************
- ;void ctblset(int chrcol,int bakcol);
- ;***************************************************
- public ctblset
- ctblset proc near
- push ebp
- mov ebp,esp
- push esi
- push edi
- push fs
-
- movzx eax,byte ptr [ebp+8]
- and al,0fh
- mov eax,[eax*4+offset colptn]
- mov [ebp+8],eax ; color pattn cheng
-
- movzx eax,byte ptr [ebp+12]
- and al,0fh
- mov eax,[eax*4+offset colptn]
- mov [ebp+12],eax ; color pattn cheng
-
- mov ecx,256 ; color bit pattn gen
- mov esi,offset fntptn
- mov edi,offset fntcol
- ctblp: lodsd
- mov edx,eax
- not edx
- and eax,[ebp+8]
- and edx,[ebp+12]
- or eax,edx
- stosd
- loop ctblp
-
- mov ax,FONTSEL ; ANK Font Selecter
- mov fs,ax
- mov esi,3D800h
- mov edi,offset ankfnt
-
- mov ecx,16*256 ; ANK bit pattn gen
- aktb1: movzx eax,byte ptr fs:[esi]
- inc esi
- mov eax,[eax*4+fntcol]
- stosd
- loop aktb1
-
- pop fs
- pop edi
- pop esi
- pop ebp
- ret
- ctblset endp
-
- ;**************************************************************
- ;
- ; 任意のCRTCレジスタに任意のワ-ド値を設定する
- ;
- ;void vram_offset(reg,ofs)
- ;int reg; [ebp+8] CRTCレジスタNo.
- ;int ofs; [ebp+12] 設定値
- ;**************************************************************
- public vram_offset
- vram_offset proc near
- push ebp
- mov ebp,esp
- push edx
-
- mov al,[ebp+8] ; CRTCレジスタNo.を
- mov dx,0440h ;
- out dx,al ; 書き込み
- mov eax,[ebp+12] ; 設定値を
- mov dx,0442h ;
- out dx,ax ; 書き込む
-
- pop edx
- pop ebp
- ret
- vram_offset endp
-
- public sjistojis
- sjistojis proc near
- movzx eax,word ptr [esp+4]
- shl ah,1 ; Shift Jis to Jis
- cmp al,080h
- adc ax,1f61h
- add al,7fh
- jc short sjis1
- add al,0a2h
- sjis1: and ah,7fh ; StoJ end
- ret
- sjistojis endp
-
- public peek
- peek proc near
- push edx
- sub eax,eax
- mov dx,[esp+8]
- in al,dx
- pop edx
- ret
- peek endp
-
- pmcode ends
- ;*************************************
- ; protect code segment defs end
- ;*************************************
-
- end